home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / HardwareProjects / UART68661.lha / UART68661 / src / 68661a.asm
Encoding:
Assembly Source File  |  1980-02-01  |  13.9 KB  |  531 lines

  1.  
  2.         SECTION 68661a.device,CODE
  3.  
  4.         incdir  "acom:include/"
  5.         include "exec/initializers.i"
  6.         include "exec/interrupts.i"
  7.         include "exec/resident.i"
  8.         include "exec/devices.i"
  9.         include "exec/errors.i"
  10.         include "libraries/dos_lib.i"
  11.         include "libraries/dosextens.i"
  12.         include "exec/exec_lib.i"
  13.         include "devices/serial.i"
  14.  
  15. ;------------------------------------------------
  16.  
  17.       STRUCTURE MyDev,LIB_SIZE
  18.            ULONG md_SysLib
  19.            ULONG md_SegList
  20.            LABEL MyDev_SIZE
  21.  
  22. ;----------------------------------------------------------------
  23.         cnop  0,4
  24. _Main
  25.         moveq #-1,d0        ;falls einers device direkt startet
  26.         rts                                
  27. ;--------------------
  28. InitTable
  29.         dc.w        RTC_MATCHWORD            ;device kennung ($4c75 oder sowas)
  30.         dc.l        InitTable                ;zeiger auf Anfang der Structur
  31.         dc.l        EndCode
  32.         dc.b        RTF_AUTOINIT             ;Flag fuer init
  33.         dc.b        VERSION
  34.         dc.b        NT_DEVICE                ;3=NodeTyp
  35.         dc.b        0                        ;Prioritaet
  36.         dc.l        Name                     ;DEVICE NAME
  37.         dc.l        idString
  38.         dc.l        Init
  39. ;--------------------------------------
  40.          cnop    0,4
  41. Name     dc.b    "68661a.device",0   ;PROB: GROSS/KLEIN SCHREIBUNG
  42.          cnop    0,4
  43. idString dc.b    "V1.00 (15 MAI 1992)",13,10,0
  44.          cnop    0,4
  45. DosName  dc.b    "dos.library",0
  46.          cnop    0,4
  47. _DOSBase dc.l    0
  48.          cnop    0,4
  49. BASIS    equ     $ef0000
  50. VERSION  equ     1
  51. REVISION equ     00
  52.  
  53. ;---------------------------------------------------------------------
  54.         cnop        0,4
  55. Init
  56.         dc.l        MyDev_SIZE
  57.         dc.l        funcTable
  58.         dc.l        dataTable
  59.         dc.l        initRoutine
  60.  
  61. funcTable
  62.  
  63.         dc.l        Open                        ;OPEN
  64.         dc.l        Close                       ;CLOSE
  65.         dc.l        Expunge                     ;EXPUNGE
  66.         dc.l        Null                        ;EXTFUNCT
  67.         dc.l        BeginIO                     ;BEGINIO
  68.         dc.l        AbortIO                     ;ABORTIO
  69.         dc.l        -1                          ;ENDE_KENNUNG
  70.  
  71. dataTable        
  72.  
  73.         INITBYTE LN_TYPE,NT_DEVICE
  74.         INITLONG LN_NAME,Name 
  75.         INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
  76.         INITWORD LIB_VERSION,VERSION
  77.         INITWORD LIB_REVISION,REVISION
  78.         INITLONG LIB_IDSTRING,idString
  79.         dc.l     0
  80. ;---------------------------------------
  81.  
  82. initRoutine ;d0=device,a0=seglist device,a6=execbase
  83.  
  84.         movem.l       d0-d7/a0-a6,-(a7)
  85.         move.l        d0,a5
  86.         move.l        a6,md_SysLib(a5)
  87.         move.l        a0,md_SegList(a5)
  88.         move.l        a5,d0
  89.  
  90.         lea           DosName,a1
  91.         moveq         #0,d0
  92.         CALLEXEC      OpenLibrary
  93.         move.l        d0,_DOSBase
  94.  
  95.         movem.l       (a7)+,d0-d7/a0-a6
  96.         rts
  97.  
  98. ;----------------------------------------
  99.  
  100. Open  ;d0=unitnum,d1=flags,a1=ioreq,a6=device!!!
  101.  
  102.         movem.l  d0-d7/a0-a6,-(a7)
  103.  
  104.         lea      Name,a1
  105.         CALLEXEC FindTask
  106.         tst.l    d0
  107.         bne      Open1
  108.  
  109.         move.l   #$8000,d0        ;Lesepuffer
  110.         move.l   #$30001,d1       ;Flags
  111.         CALLEXEC AllocMem
  112.         move.l   d0,Min
  113.         move.l   d0,Pointer
  114.         move.l   d0,Merke
  115.         addi.l   #$8000,d0
  116.         move.l   d0,Max
  117.  
  118.         move.l   #10000,d4
  119.         move.l   #proc_seglist,d3
  120.         lsr.l    #2,d3
  121.         moveq    #0,d2
  122.         move.l   #Name,d1
  123.         CALLDOS  CreateProc
  124.         move.l   d0,MYPROC
  125.  
  126.         lea      INT6,a1
  127.         move.l   #13,d0
  128.         CALLEXEC AddIntServer
  129.         move.b   #$4d,BASIS+5     ;
  130.         move.b   #$3c,BASIS+5     ;2400brot
  131.         move.b   #$27,BASIS+7
  132.  
  133.         move.l   #$11130000,IO_CTLCHAR(a1)
  134.         move.l   #$8000,IO_RBUFLEN(a1)
  135.         move.l   #0,IO_EXTFLAGS(a1)
  136.         move.l   #2400,IO_BAUD(a1)
  137.         move.l   #250000,IO_BRKTIME(a1)
  138.         move.b   #8,IO_READLEN(a1)
  139.         move.b   #8,IO_WRITELEN(a1)
  140.         move.b   #1,IO_STOPBITS(a1)
  141.         move.b   #$B4,IO_SERFLAGS(a1)
  142. Open1
  143.         movem.l  (a7)+,d0-d7/a0-a6
  144.  
  145.  
  146.         addq.w   #1,LIB_OPENCNT(a6)
  147.         clr.l    d0
  148. ;        move.b   d0,IO_ERROR(a1)
  149. ;        move.b   #NT_REPLYMSG,LN_TYPE(a1)
  150.         rts
  151.  
  152. ;---------------------------------------------------
  153. Close   ;a1=ioreq,a6=device,,,,d0=seglist oder 0
  154.  
  155.         clr.l      d0
  156.         subq.w     #1,LIB_OPENCNT(a6)      ;Zaehler fuer Anzahl der Zugriffe -1
  157.         bsr        Expunge                 ;Device entfernen
  158.         rts
  159. ;--------------------------------------------------
  160. Expunge ;a6=device,d0=seglist device
  161.  
  162.         movem.l    d2/a5-a6,-(a7)          ;Register retten
  163.         move.l     a6,a5                   ;Zeiger auf Device nach a5
  164.         move.l     md_SysLib(a5),a6        ;ExecBase nach a6
  165.         tst.w      LIB_OPENCNT(a5)         ;Zaehler fuer Anzahl der oeffnungen
  166.         beq        1$                      ;Springe, wenn Device entfernt wi
  167.         clr.l      d0                      ;Zeiger auf Segment loechen
  168.         bra        Expunge_end             ;Ruecksprung
  169. 1$
  170.         movem.l    d0-d6/a0-a6,-(a7)
  171.  
  172.         lea        Name,a1
  173.         CALLEXEC   FindTask
  174.         tst.l      d0
  175.         beq        2$
  176.  
  177.         move.b     #0,BASIS+7              ;rx/tx ausschalten
  178.         lea        INT6,a1
  179.         move.l     #13,d0
  180.         CALLEXEC   RemIntServer
  181.  
  182.         move.l     Min,a1
  183.         move.l     #$8000,d0
  184.         CALLEXEC   FreeMem
  185.  
  186.         move.l     MYPROC,a1
  187.         lea       -pr_MsgPort(a1),a1
  188.         CALLEXEC   RemTask
  189. 2$
  190.         movem.l    (a7)+,d0-d6/a0-a6
  191.  
  192.         move.l     md_SegList(a5),d2       ;Zeiger auf Segment Liste holen
  193.         move.l     a5,a1                   ;Zeiger auf Device nach a1
  194.         CALLEXEC   Remove                  ;Device aus Liste loechen
  195.         move.l     _DOSBase,a1
  196.         CALLEXEC   CloseLibrary
  197.         move.l     a5,a1                   ;Zeiger auf Device
  198.         clr.l      d0                      ;d0 loechen
  199.         move.w     LIB_NEGSIZE(a5),d0      ;Negative Groesse holen
  200.         sub.l      d0,a1                   ;Anfang des Speichers fuer Device bestimmen
  201.         add.w      LIB_POSSIZE(a5),d0      ;Laenge von Device bestimmen
  202.         CALLEXEC   FreeMem                 ;Speicher freigeben
  203.         move.l     d2,d0                   ;zeiger auf Segmentliste
  204. Expunge_end
  205.         movem.l    (a7)+,d2/a5-a6          ;Register zurueckschreiben
  206.         rts                        
  207. ;----------------------------------------------
  208. Null
  209.         clr.l   d0    ;unused
  210.         rts
  211. ;----------------------------------------------
  212. BeginIO ;a1=ioreq,a6=device!!!!!!
  213.  
  214.         clr.l   d0
  215.         move.w  IO_COMMAND(a1),d0
  216.  
  217.         cmp.w   #1,d0
  218.         beq     MyReset
  219.         cmp.w   #2,d0
  220.         beq     Read
  221.         cmp.w   #3,d0
  222.         beq     Write
  223.         cmp.w   #4,d0
  224.         beq     Update
  225.         cmp.w   #5,d0
  226.         beq     Clear
  227.         cmp.w   #6,d0
  228.         beq     MyStop
  229.         cmp.w   #7,d0
  230.         beq     Start
  231.         cmp.w   #8,d0
  232.         beq     Flush
  233.         cmp.w   #9,d0
  234.         beq     Query
  235.         cmp.w   #10,d0
  236.         beq     Break
  237.         cmp.w   #11,d0
  238.         beq     SetParams
  239.  
  240.         move.b  #IOERR_NOCMD,IO_ERROR(a1)
  241.         bsr     TermIO
  242.         rts
  243. ;---------------------------------------------
  244. AbortIO
  245.  
  246.         cmp.w    #2,IO_COMMAND(a1) ;readrequest?
  247.         bne      Abort_end
  248.  
  249.     movem.l    d0-d6/a0-a6,-(a7)
  250.  
  251.         move.l   #1,IOABORT
  252.         move.l    SIGTASK,a1
  253.         move.l    SIGMASK,d0
  254.         CALLEXEC    Signal
  255.  
  256.     movem.l    (a7)+,d0-d6/a0-a6
  257.  
  258. Abort_end
  259.         moveq    #0,d0
  260.         rts
  261.  
  262. ;---------------------------------------------
  263. TermIO
  264.         btst     #IOB_QUICK,IO_FLAGS(a1)
  265.         bne      TermIO_end  ;bei quick keine ReplyMsg
  266.         move.l   a6,-(a7)
  267.         CALLEXEC ReplyMsg
  268.         move.l   (a7)+,a6
  269. TermIO_end
  270.         rts
  271. ;------------------------------------------------------------------
  272. ;a1=ioreq,a3=unit,a6=device
  273. ;-------------------------------------------------------IO_COMMANDS
  274. Invalid ;0
  275.         move.b   IOERR_NOCMD,IO_ERROR(a1)
  276.         bsr      TermIO
  277.         rts
  278. ;---------------------------------------
  279. MyReset ;1#
  280.         clr.b    IO_ERROR(a1)
  281.         bsr      TermIO
  282.         rts
  283. ;---------------------------------------
  284. Read    ;2
  285.  
  286.         bclr     #IOB_QUICK,IO_FLAGS(a1)
  287.         move.l   MYPROC,a0
  288.         move.l   a6,-(sp)
  289.         CALLEXEC PutMsg
  290.         move.l   (sp)+,a6
  291.         rts
  292.  
  293. ;---------------------------------------
  294. Write   ;3
  295.  
  296.         move.l   IO_DATA(a1),a0
  297.         cmpi.l   #-1,IO_LENGTH(a1)
  298.         beq      Write_null
  299.         move.l   IO_LENGTH(a1),d0
  300.         beq      Write_end
  301.  
  302.         subq.l   #1,d0
  303.  
  304. Write1
  305.         move.b   (a0)+,BASIS+1
  306. Write2
  307.         btst     #0,BASIS+3
  308.         beq      Write2
  309.         dbra     d0,Write1
  310.  
  311. Write_end
  312.         move.b   #0,IO_ERROR(a1)
  313.         move.l   IO_LENGTH(a1),IO_ACTUAL(a1)
  314.  
  315.         bsr      TermIO
  316.         rts
  317.  
  318. Write_null
  319. Write3  tst.b    (a0)
  320.         beq      Write_end
  321.         move.b   (a0)+,BASIS+1
  322. Write4  btst     #0,BASIS+3
  323.         beq      Write4
  324.         bra      Write3
  325.  
  326. ;---------------------------------------
  327. Update  ;4
  328.         bra      Invalid
  329. ;---------------------------------------
  330. Clear   ;5
  331.         move.l   #0,Count
  332.         move.l   Min,Pointer
  333.         move.l   Min,Merke
  334.         clr.b    IO_ERROR(a1)
  335.         bsr      TermIO
  336.         rts
  337. ;---------------------------------------
  338. MyStop  ;6
  339.         bsr      TermIO
  340.         rts
  341. ;---------------------------------------
  342. Start   ;7
  343.         bsr      TermIO
  344.         rts
  345. ;---------------------------------------
  346. Flush   ;8
  347.         bsr      TermIO
  348.         rts
  349. ;---------------------------------------
  350. Query   ;9
  351.         move.l   Count,IO_ACTUAL(a1)
  352.         move.w   #$0020,IO_STATUS(a1)
  353.         btst     #7,BASIS+3 ;eigentlich #6 aber DCD und DSR vertauscht!!
  354.         beq      Query1
  355.         move.w   #$0000,IO_STATUS(a1)
  356. Query1
  357.         move.b   #0,IO_ERROR(a1)
  358.         bsr      TermIO
  359.         rts
  360. ;---------------------------------------
  361. Break   ;10
  362.         bsr      TermIO
  363.         rts
  364.  
  365. ;---------------------------------------
  366. SetParams ;CMD_11
  367.           cmpi.l  #300,IO_BAUD(a1)
  368.           bne     Set1200
  369.           move.b  #$4d,BASIS+5
  370.           move.b  #$36,BASIS+5
  371. Set1200   cmpi.l  #1200,IO_BAUD(a1)
  372.           bne     Set2400
  373.           move.b  #$4d,BASIS+5
  374.           move.b  #$39,BASIS+5
  375. Set2400   cmpi.l  #2400,IO_BAUD(a1)
  376.           bne     Set9600
  377.           move.b  #$4d,BASIS+5
  378.           move.b  #$3c,BASIS+5
  379. Set9600   cmpi.l  #9600,IO_BAUD(a1)
  380.           bne     Set19200
  381.           move.b  #$4d,BASIS+5
  382.           move.b  #$3e,BASIS+5
  383. Set19200  cmpi.l  #19200,IO_BAUD(a1)
  384.           bne     Set38400
  385.           move.b  #$4d,BASIS+5
  386.           move.b  #$3f,BASIS+5
  387. Set38400  cmpi.l  #38400,IO_BAUD(a1)
  388.           bne     SetEnd
  389.           move.b  #$4d,BASIS+5
  390.           move.b  #$3f,BASIS+5
  391. SetEnd
  392.           bsr     TermIO
  393.           rts
  394.  
  395. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  396. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  397.         cnop     0,8
  398. proc_seglist
  399.         dc.l     0
  400. proc_begin
  401.         sub.l    a1,a1
  402.         CALLEXEC FindTask
  403.         move.l   d0,SIGTASK
  404.         move.l   d0,a0
  405.         lea      pr_MsgPort(a0),a5
  406.  
  407.         clr.l    d1
  408.         clr.l    d0
  409.         move.b   MP_SIGBIT(a5),d0
  410.         bset     d0,d1
  411.         move.l   d1,SIGMASK
  412.  
  413. ;--------------------------
  414. proc_main
  415.  
  416.     move.l    SIGMASK,d0
  417.     CALLEXEC    Wait
  418.  
  419. proc_next
  420.         move.l   a5,a0
  421.         CALLEXEC GetMsg
  422.         tst.l    d0
  423.         beq      proc_main
  424.         move.l   d0,a1
  425. ;---------------------
  426.  
  427.         move.l   IO_DATA(a1),a4
  428.         move.l   IO_LENGTH(a1),d4
  429.         move.l   #0,d3 ;Actual
  430.         bra      proc_read
  431.  
  432. proc_wait
  433.  
  434.         move.l   a1,-(sp)
  435.  
  436.     move.l    SIGMASK,d0
  437.     CALLEXEC    Wait
  438.  
  439.         move.l   (sp)+,a1
  440.  
  441. proc_read
  442.         cmpi.l   #1,IOABORT
  443.         beq      proc_end
  444.  
  445.         tst.l    d4               ;null bytes gefordert?
  446.         beq      proc_end
  447.  
  448.         cmpi.l   #0,Count
  449.         beq      proc_wait        ;kein byte da
  450.  
  451.         move.l   Merke,a3
  452.         move.b   (a3)+,(a4)+
  453.         move.l   a3,Merke
  454.  
  455.         cmpa.l   Max,a3            ;PufferEnde?
  456.         bne      proc5
  457.         move.l   Min,Merke         ;wenn ja: LeseZeiger auf PufferAnfang
  458. proc5
  459.  
  460.         sub.l    #1,Count
  461.         add.l    #1,d3
  462.         sub.l    #1,d4
  463.         bne      proc_read
  464.  
  465. proc_end
  466.         move.l   #0,IOABORT
  467.         move.l   d3,IO_ACTUAL(a1)
  468.         CALLEXEC ReplyMsg
  469.         bra      proc_next
  470.  
  471. IOABORT  dc.l 0
  472. MYPROC   dc.l 0
  473. SIGTASK  dc.l 0
  474. SIGMASK  dc.l 0
  475. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  476. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  477.         cnop 0,4
  478. INT6    dc.l 0        ;LN_SUCC
  479.         dc.l 0        ;LN_PRED
  480.         dc.b 2        ;LN_TYPE 2=interrupt
  481.         dc.b 0        ;LN_PRI
  482.         dc.l Name     ;LN_NAME
  483.         dc.l 0        ;IS_DATA
  484.         dc.l Server   ;IS_CODE
  485.         dc.b 0,0      ;Pad
  486.         ds.l 100
  487.  
  488.         cnop     0,4               ;/INT6 von RxRDY(pin14) ausgeloest.
  489. Server
  490.         movem.l  d0-d6/a0-a6,-(sp)
  491.  
  492.         btst     #1,BASIS+3        ;RBF?
  493.         beq      ServEnd           ;nein
  494.  
  495.         addq.l   #1,Count
  496.  
  497.         move.l   Pointer,a0
  498.         move.b   BASIS+1,(a0)+     ;Speichern und Pointer +1
  499.         move.l   a0,Pointer        ;Pointer sichern
  500.  
  501.         cmpa.l   Max,a0            ;PufferEnde?
  502.         bne      ServOV
  503.         move.l   Min,Pointer       ;wenn ja: Zeiger auf PufferAnfang
  504. ServOV
  505.  
  506. ;    btst     #0,BASIS+3        ;TBE?
  507. ;    beq      Serv2             ;nein
  508.  
  509.         move.l    SIGTASK,a1
  510.         move.l    SIGMASK,d0
  511.         CALLEXEC    Signal
  512.  
  513. ServEnd
  514.         movem.l  (sp)+,d0-d6/a0-a6
  515.  
  516.         moveq    #0,d0
  517.         rts
  518.  
  519. Pointer dc.l 0               ;Schreibzeiger
  520. Merke   dc.l 0               ;Lesezeiger
  521. Count   dc.l 0               ;Anzahl Bytes
  522. Min     dc.l 0
  523. Max     dc.l 0
  524. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  525. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  526. EndCode END
  527.  
  528.  
  529.  
  530.  
  531.